/*-
* Public Domain 2014-2020 MongoDB, Inc.
* Public Domain 2008-2014 WiredTiger, Inc.
*
* This is free and unencumbered software released into the public domain.
*
* Anyone is free to copy, modify, publish, use, compile, sell, or
* distribute this software, either in source code form or as a compiled
* binary, for any purpose, commercial or non-commercial, and by any
* means.
*
* In jurisdictions that recognize copyright laws, the author or authors
* of this software dedicate any and all copyright interest in the
* software to the public domain. We make this dedication for the benefit
* of the public at large and to the detriment of our heirs and
* successors. We intend this dedication to be an overt act of
* relinquishment in perpetuity of all present and future rights to this
* software under copyright law.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* ex_access.c
*      demonstrates how to create and access a simple table.
*/
#include <test_util.h>

typedef struct My_Struct
{
	int m; 
	int s;
	int n;
}My_Struct;
static const char *home;


static void
print_cursor(WT_CURSOR *cursor)
{
	const char *desc, *pvalue;
	char key[20];
	int64_t value;
	int ret;
	while ((ret = cursor->next(cursor)) == 0) {
		cursor->get_key(cursor, &key);
		error_check(cursor->get_value(cursor, &desc, &pvalue, &value));
		if (value != 0)
			printf("%s=%s\n", desc, pvalue);
	}
	scan_end_check(ret == WT_NOTFOUND);
}


 void
print_database_stats1(WT_SESSION * session)
{
	 WT_CURSOR *cursor1;
	 error_check(session->open_cursor(session, "table:access", NULL, "raw", &cursor1));

	 WT_ITEM item1;
	 WT_ITEM key1;
	 My_Struct my2;
	 char key[20] = { '\0' };
	 cursor1->reset(cursor1);
	 int ret;
	 while ((ret = cursor1->next(cursor1)) == 0) {
		 error_check(cursor1->get_key(cursor1, &key1));
		 memcpy(key, key1.data, key1.size);

		 error_check(cursor1->get_value(cursor1, &item1));

		memcpy(&my2, item1.data, item1.size);


		 //printf("Got record: %s : %s\n", key, value);
	 }

}

static void access_example(void)
{
	WT_CONNECTION *conn;
	WT_CURSOR *cursor;
	WT_SESSION *session;
	const char *key, *value;
	int ret;
	/* Open a connection to the database, creating it if necessary. */
	error_check(wiredtiger_open(home, NULL, "create, file_extend=(data=1MB) ", &conn));
	/* Open a session handle for the database. */
	error_check(conn->open_session(conn, NULL, NULL, &session));
	error_check(session->create(session, "table:access", "key_format=S,value_format=u"));
	error_check(session->open_cursor(session, "table:access", NULL, NULL, &cursor));

	WT_CURSOR_BTREE *cbt = (WT_CURSOR_BTREE *)cursor;
	WT_ITEM item;
	item.data = malloc(sizeof(struct My_Struct));

	My_Struct my;
	my.m = 30;
	my.n = 30;
	my.s = 100;
	item.size = sizeof(struct My_Struct);
	memcpy(item.data, &my, sizeof(struct My_Struct));

	char key1[20];
	char value1[20];
	for (int i =19; i <10; i++)
	{
		sprintf(key1, "key%d", i);
		sprintf(value1, "value%d", i);
		my.m += i;
		my.n += i;
		my.s += i;
		memcpy(item.data, &my, sizeof(struct My_Struct));

		cursor->set_key(cursor, key1); /* Insert a record. */
		cursor->set_value(cursor, &item);
	
	cursor->insert(cursor);


		
		
	}
	//ret = cursor->next(cursor);
	//ret = cursor->next(cursor);
	
	error_check(cursor->reset(cursor)); /* Restart the scan. */
	cursor->close(cursor);

	print_database_stats1(session);

	WT_CURSOR *cursor1;
	error_check(session->open_cursor(session, "table:access", NULL, NULL, &cursor1));
	
	WT_ITEM item1;
	My_Struct my2;
	while ((ret = cursor1->next(cursor1)) == 0) {
		error_check(cursor1->get_key(cursor1, &key));
		error_check(cursor1->get_value(cursor1, &item1));

		memcpy(&my2, item1.data, sizeof(struct My_Struct));


		//printf("Got record: %s : %s\n", key, value);
	}


	cursor1->close(cursor1);
	


	//scan_end_check(ret == WT_NOTFOUND); /* Check for end-of-table. */
	error_check(conn->close(conn, NULL)); /* Close all handles. */
}

typedef struct Struct1 {
	int m;
	int n;
} Struct1;

typedef struct Struct2 {
	int ss;
	Struct1 u1;
	char *p;
}Struct2;

void test()
{
	static int m = 30;

	printf("maddrss %d\n", &m);
}
int main_access(int argc, char *argv[])
{
	test(); test();

	Struct2 *p =(Struct2 *) malloc(sizeof(Struct2));
	p->u1.m = 30;
	
	Struct1 *p2 = (Struct1 *)p;

	Struct2 *p3 = (Struct2 *)p2;

	
	home = "e:/wiredtirge";// example_setup(argc, argv);
	access_example();
	return (EXIT_SUCCESS);
}